/**
 * Copyright © 2010-2011 Nokia
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.googlecode.jsonschema2pojo.rules;

import com.googlecode.jsonschema2pojo.DefaultGenerationConfig;
import com.googlecode.jsonschema2pojo.GenerationConfig;
import com.sun.codemodel.JClass;
import com.sun.codemodel.JClassContainer;
import com.sun.codemodel.JDefinedClass;
import com.sun.codemodel.JDocComment;
import com.sun.codemodel.JDocCommentable;
import com.sun.codemodel.JFieldVar;
import com.sun.codemodel.JPackage;
import com.sun.codemodel.JType;

public class RuleFactoryImpl implements RuleFactory {

    private final GenerationConfig generationConfig;

    /**
     * Create a new rule factory with the given generation config options.
     * 
     * @param generationConfig
     *            The generation config options for type generation. These
     *            config options will influence the java code generated by rules
     *            created by this factory.
     */
    public RuleFactoryImpl(GenerationConfig generationConfig) {
        this.generationConfig = generationConfig;
    }

    /**
     * Create a rule factory with the default generation config options.
     * 
     * @see DefaultGenerationConfig
     */
    public RuleFactoryImpl() {
        this(new DefaultGenerationConfig());
    }
    
    @Override
    public SchemaRule<JPackage, JClass> getArrayRule() {
        return new ArrayRule(this);
    }

    @Override
    public SchemaRule<JDocCommentable, JDocComment> getDescriptionRule() {
        return new DescriptionRule();
    }

    @Override
    public SchemaRule<JClassContainer, JDefinedClass> getEnumRule() {
        return new EnumRule();
    }

    @Override
    public SchemaRule<JType, JType> getFormatRule() {
        return new FormatRule(this);
    }

    @Override
    public SchemaRule<JPackage, JType> getObjectRule() {
        return new ObjectRule(this);
    }

    @Override
    public SchemaRule<JDefinedClass, JDefinedClass> getPropertiesRule() {
        return new PropertiesRule(this);
    }

    @Override
    public SchemaRule<JDefinedClass, JDefinedClass> getPropertyRule() {
        return new PropertyRule(this);
    }

    @Override
    public SchemaRule<JDocCommentable, JDocComment> getRequiredRule() {
        return new RequiredRule();
    }

    @Override
    public SchemaRule<JClassContainer, JType> getTypeRule() {
        return new TypeRule(this);
    }

    @Override
    public SchemaRule<JDefinedClass, JDefinedClass> getAdditionalPropertiesRule() {
        return new AdditionalPropertiesRule(this);
    }

    @Override
    public SchemaRule<JDocCommentable, JDocComment> getTitleRule() {
        return new TitleRule();
    }

    @Override
    public SchemaRule<JClassContainer, JType> getSchemaRule() {
        return new JsonSchemaRule(this);
    }

    @Override
    public SchemaRule<JFieldVar, JFieldVar> getDefaultRule() {
        return new DefaultRule();
    }

    @Override
    public GenerationConfig getGenerationConfig() {
        return generationConfig;
    }

}
